package cn.itedus.lottery.domain.support.ids.policy;

import cn.hutool.core.lang.Snowflake;
import cn.hutool.core.net.NetUtil;
import cn.hutool.core.util.IdUtil;
import cn.itedus.lottery.domain.support.ids.IIdGenerator;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;

/**
 * hutool 工具包下的雪花算法
 * 一般在实际使用雪花算法时需要做一些优化处理，
 * 比如支持时间回拨、支持手工插入、简短生成长度、提升生成速度等。
 * 15位雪花算法推荐
 * https://github.com/yitter/idgenerator/blob/master/Java/source/src/main/java/com/github/yitter/core/SnowWorkerM1.java
 */
@Component
public class SnowFlake implements IIdGenerator {

    private Snowflake snowflake;

    @PostConstruct
    public void init() {
        // 0~31位，可以采用配置的方式使用
        long workId;
        try {
            workId = NetUtil.ipv4ToLong(NetUtil.getLocalhostStr());
        } catch (Exception e) {
            workId = NetUtil.getLocalhostStr().hashCode();
        }
        workId = workId >> 16 & 31;
        long dateCenterId = 1L;
        snowflake = IdUtil.createSnowflake(workId, dateCenterId);
    }

    @Override
    public Long nextId() {
        return snowflake.nextId();
    }

}
